home *** CD-ROM | disk | FTP | other *** search
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
- /* |_o_o|\\ Copyright (c) 1986 The Software Distillery. All Rights Reserved */
- /* |. o.| || This program may not be distributed without the permission of */
- /* | . | || the authors. */
- /* | o | || Dave Baker Ed Burnette Stan Chow Jay Denebeim */
- /* | . |// Gordon Keener Jack Rouse John Toebes Doug Walker */
- /* ====== BBS:(919)-471-6436 VOICE:(919)-469-4210 */
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <workbench/workbench.h>
- #include <workbench/icon.h>
- #include <workbench/startup.h>
- #include <libraries/dos.h>
- #include <libraries/dosextens.h>
-
- int setarg(struct WBArg *, char *, struct Lock *);
- void msg(char *, char *);
-
- struct IconBase *IconBase;
- #define ICON_REV 0
-
- void main(argc, argv)
- register int argc;
- char **argv;
- {
- register struct WBStartup *WBStartup;
- register struct DiskObject *diskobj;
- char *torun, nambuf[160];
- register int stacksize, i;
- struct Process *ourtask;
- struct MsgPort *replyport;
- register struct Lock *olddir, *lock;
-
- /* initialize so our cleanup routine runs fine */
- WBStartup = NULL;
- IconBase = NULL;
- diskobj = NULL;
- replyport = NULL;
- olddir = NULL;
-
- /* running this from workbench is ridiculous so just quit */
- if (argc == 0) XCEXIT(-1);
-
- /* issue the copyright notice - they can supress it by doing a WBRUN >NIL: */
- msg(
- "\x9B33mWBRun\x9B0m by John Toebes - Copyright © 1986 \x9B4mThe Software Distillery\x9B0m\n",
- "235 Trillingham Ln, Cary NC 27511 BBS:(919)-471-6436");
-
- /* not enough parameters? - give them the usage */
- if (argc < 2)
- {
- msg(
- "Usage: WBRun icon(s)\nWhere icon(s) is to run as if selected from Workbench\n",
- "Note: Use WBRun >NIL: icon(s) to hide copyright message");
- goto done;
- }
-
- /* open the libraries we will need */
- if ((IconBase = (struct IconBase *)OpenLibrary(ICONNAME, ICON_REV)) == NULL)
- goto done;
-
- /* find ourselves - if this doesn't work it deserves to die a horrible */
- /* death so I will not even look at our result */
- ourtask = (struct Process *)FindTask(NULL);
-
- /* allocate storage for all the arguments on the list */
- if ((WBStartup = (struct WBStartup *)
- AllocMem(sizeof(struct WBStartup), MEMF_CLEAR)) == NULL)
- goto done;
-
- if ((WBStartup->sm_ArgList = (struct WBArg *)
- AllocMem(sizeof(struct WBArg)*argc, MEMF_CLEAR)) == NULL)
- goto done;
-
- if ((replyport = (struct MsgPort *)CreatePort("PhoneyWorkbench", 0)) == NULL)
- goto done;
-
- /* initialize the remainder of the startup fields */
- WBStartup->sm_Message.mn_ReplyPort = replyport;
- WBStartup->sm_NumArgs = argc-1;
-
- /* run through all the arguments getting locks and names for them */
- for (i=1; i<argc; i++)
- if (setarg(&WBStartup->sm_ArgList[i-1], argv[i],
- (struct Lock *)ourtask->pr_CurrentDir))
- goto done;
-
- /*-- Load the code that is desired ---*/
- /* to do this, first find the program to be run */
- olddir = (struct Lock *)CurrentDir( WBStartup->sm_ArgList[0].wa_Lock );
-
- if ((diskobj = (struct DiskObject *)
- GetDiskObject( WBStartup->sm_ArgList[0].wa_Name )) == NULL)
- {
- msg("Can't get icon for ", WBStartup->sm_ArgList[0].wa_Name);
- goto done;
- }
-
- torun = argv[1];
-
- /* once we have the object, look at the tool type */
- /* for TOOLS we run the program (argv[0] in our case) */
- /* For projects it has the name of the default tool to run with it */
- /* all others are to be blown away */
- if (diskobj->do_Type == WBPROJECT)
- {
- /* for a project, we need to insert the tool icon as the first tool */
- /* move everything over one */
- movmem(&WBStartup->sm_ArgList[0],&WBStartup->sm_ArgList[1],
- (argc-1)*sizeof(struct WBArg));
- strcpy(nambuf, diskobj->do_DefaultTool);
- torun = nambuf;
-
- if (setarg(&WBStartup->sm_ArgList[0], torun, olddir))
- goto done;
-
- FreeDiskObject(diskobj);
-
- if ((diskobj = (struct DiskObject *)
- GetDiskObject( WBStartup->sm_ArgList[0].wa_Name )) == NULL)
- {
- msg("Can't get icon for ", WBStartup->sm_ArgList[0].wa_Name);
- goto done;
- }
-
- WBStartup->sm_NumArgs++;
- }
-
- /* at this point if it is not a TOOL we are scrod */
- if (diskobj->do_Type != WBTOOL)
- {
- msg("Icon is not runnable for ", torun);
- goto done;
- }
-
- if ((stacksize = diskobj->do_StackSize) < 4000)
- stacksize = 4000;
-
- /* so lets load the segment for the program to run */
- if ((WBStartup->sm_Segment = (BPTR)LoadSeg(torun)) == NULL)
- {
- msg("Can't open tool ", torun);
- goto done;
- }
-
- /* also we will need to get it going as a process */
- if ((WBStartup->sm_Process = (struct MsgPort *)
- CreateProc(torun, 0, WBStartup->sm_Segment, stacksize)) == NULL)
- {
- msg("Can't create process for ", torun);
- goto done;
- }
-
- /* we are off and running, pass it the message to get running */
- WBStartup->sm_ToolWindow = diskobj->do_ToolWindow;
-
- PutMsg(WBStartup->sm_Process, WBStartup);
-
- /* when he is done with what he needs, we can blow everything away */
- WaitPort(replyport);
-
- /* everything is now complete so clean up and go away */
- done:
- if (replyport != NULL) DeletePort(replyport);
- replyport = NULL;
-
- if (diskobj != NULL) FreeDiskObject(diskobj);
- diskobj = NULL;
-
- if (olddir != NULL) CurrentDir(olddir);
-
- if (WBStartup != NULL)
- {
- if (WBStartup->sm_Segment != NULL)
- UnLoadSeg(WBStartup->sm_Segment);
- if (WBStartup->sm_ArgList != NULL)
- {
- /* run through and free any locks we may have */
- for (i=0; i<argc; i++)
- {
- lock = (struct Lock *)WBStartup->sm_ArgList[i].wa_Lock;
- if ((lock != NULL) && (lock != (struct Lock *)ourtask->pr_CurrentDir))
- UnLock(lock);
- }
- FreeMem(WBStartup->sm_ArgList,sizeof(struct WBArg)*argc);
- }
- FreeMem(WBStartup, sizeof(struct WBStartup));
- }
- WBStartup = NULL;
-
- if (IconBase != NULL) CloseLibrary(IconBase);
- IconBase = NULL;
-
- XCEXIT(0);
- }
-
- /***********************************************************/
- /* given a null terminated name, fill in a WBArg structure */
- /* with a lock and a name relative to that lock */
- /***********************************************************/
- int setarg(WBArg, name, curdir)
- register struct WBArg *WBArg;
- char *name;
- struct Lock *curdir;
- {
- register char *p, *lastc;
- register unsigned char c;
-
- if (name == NULL || !*name) return(1); /* bad name to use */
-
- /* first find the last colon or slash in the name */
- lastc = NULL;
- for (p = name; *p; p++)
- if (*p == ':' || *p == '/')
- lastc = p+1;
-
- /* was there a path delimiter at all ? */
- if (lastc == NULL)
- {
- /* no, use the default lock and full name */
- WBArg->wa_Lock = (BPTR)curdir;
- WBArg->wa_Name = name;
- }
- else
- {
- /* must get a lock on the right directory and use part of the name */
- if (!*lastc) return(1); /* only a drawer specified */
- WBArg->wa_Name = lastc;
-
- /* when setting a directory, we need to include the delimiter */
- c = *lastc;
- *lastc = NULL;
- if ((WBArg->wa_Lock = (BPTR)Lock(name)) == NULL)
- {
- msg("Cannot open directory:", name);
- return(1); /* couldn't find the director */
- }
- *lastc++ = c;
- }
-
- /* it worked so let them continue on */
- return(0);
- }
-
- void msg(str1, str2)
- char *str1, *str2;
- {
- Write(Output(),str1,strlen(str1));
- Write(Output(),str2,strlen(str2));
- Write(Output(),"\n", 1);
- }
-
- void MemCleanup(){}
-